﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer;
using Metabase.MetabaseObjects;

namespace Metabase
{
    public class MetabaseHandler
    {
        public DBHandler dbHandler;
        public string MetabaseName;
        public List<MetabaseObject> metabaseObjectList;
        // Признак инициализации метабазы
        private bool _MetabaseExists;
        public bool MetabaseExists { get { return _MetabaseExists; } }
        
        // Удаление Метабазы
        public void DropMetabase()
        {
            DropBaseTables();
        }
        
        // Обновление наименования метабазы
        public void UpdateMetabase(string MetabaseName)
        {
            string commandText = "update mb_MetabaseStructure set Object_Name = @metabase_name where Type_ID = @type_id";
            using (SqlCommand dbCommand = new SqlCommand(commandText, dbHandler.connection)) 
            {
                dbCommand.Parameters.Add("type_id", SqlDbType.Int).Value = ObjectTypes.otMetabase;
                dbCommand.Parameters.Add("metabase_name", SqlDbType.VarChar).Value = MetabaseName;
                dbCommand.ExecuteNonQuery(); 
            }
        }
        
        // Создание метабазы
        public void CreateMetabase(string MetabaseName)
        {
            CreateBaseTables(MetabaseName);
        }
        
        // Создание базовых таблиц
        private void CreateBaseTables(string MetabaseName)
        {
            // Получим скрипт из ресурса и передадим в качестве параметра наименование метабазы
            string scriptText = string.Format(Properties.Resources.create_metabase.ToString(), "'" + MetabaseName + "'");
            // Выполним команды
            foreach (string commandText in SqlService.ScriptService(scriptText))
            {
                using (SqlCommand dbCommand = new SqlCommand(commandText, dbHandler.connection)) { dbCommand.ExecuteNonQuery(); }
            }
        }

        // Процедура удаления данных Метабазы
        private void DropBaseTables()
        {
            // Получим скрипт из ресурса
            string scriptText = Properties.Resources.drop_metabase.ToString();
            // Выполним команды
            foreach (string commandText in SqlService.ScriptService(scriptText))
            {
                using (SqlCommand dbCommand = new SqlCommand(commandText, dbHandler.connection)) { dbCommand.ExecuteNonQuery(); }
            }
        }
        
        // Функция проверки наличия Метабазы
        bool CheckMetabaseExistings()
        {
            return false;
        }
        
        // Начальная инициализация Метабазы
        public void InitMetabase()
        {
            // Наличие метабазы проверим по наличию таблицы структуры данных
            _MetabaseExists = SqlService.tableExistsSQLServer(this.dbHandler.connection, this.dbHandler.Schema, "mb_MetabaseStructure");
        }

        // Получение списка объектов Метабазы
        public List<MetabaseObject> GetMetabaseObjectList(MetabaseObject parentObject = null)
        {
            List<MetabaseObject> metabaseObjectList = new List<MetabaseObject>();
            string queryText;
            if (parentObject == null) queryText = "select ms.*, ot.Type_Name from mb_MetabaseStructure ms, mb_MetabaseObjectTypes ot where ms.Type_ID = ot.Type_ID order by Parent_ID, Object_Name";
            else queryText = "select ms.*, ot.Type_Name from mb_MetabaseStructure ms, mb_MetabaseObjectTypes ot where Parent_ID = @Parent_Id and ms.Type_ID = ot.Type_ID order by Object_Name";
            //else queryText = "select * from mb_MetabaseStructure where Parent_ID = @Parent_Id order by Object_Name";
            using (SqlCommand dbCommand = new SqlCommand(queryText, this.dbHandler.connection))
            {
                if (parentObject != null)
                {
                    dbCommand.Parameters.Add("Parent_Id", SqlDbType.Int).Value = (int)parentObject.ID;
                }
                SqlDataReader cursor = dbCommand.ExecuteReader();
                while (cursor != null && cursor.Read())
                {
                    MetabaseObject metaObject = new MetabaseObject 
                    {
                        ID = cursor["ID"],
                        External_ID = cursor["External_ID"],
                        Parent_ID = cursor["Parent_ID"],
                        Type_ID = cursor["Type_ID"],
                        Type_Name = cursor["Type_Name"],
                        Object_Name = cursor["Object_Name"],
                        Description = cursor["Description"],
                        Modify_Date = cursor["Modify_Date"],
                        metabaseHandler = this,
                    };
                    metabaseObjectList.Add(metaObject);
                }
                cursor.Close();
            }
            return metabaseObjectList;
        }

    }

}
